package com.share.modules.monitor.config;

import de.codecentric.boot.admin.server.config.AdminServerProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;

/**
 * 监控权限配置
 */
@EnableWebSecurity
public class WebSecurityConfigurer {
    private final String adminContextPath;

    // 注入 AdminServerProperties，获取监控平台的上下文路径
    public WebSecurityConfigurer(AdminServerProperties adminServerProperties) {
        this.adminContextPath = adminServerProperties.getContextPath();
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // 配置登录成功后的跳转处理器（保持原有逻辑）
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo"); // 支持自定义跳转参数
        successHandler.setDefaultTargetUrl(adminContextPath + "/"); // 默认跳转到监控平台首页

        // Lambda 风格配置（Spring Security 5.7+ 推荐）
        http
                // 1. 禁用 frameOptions（避免 iframe 嵌套问题，监控页面可能需要）
                .headers(headers -> headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable))

                // 2. 配置 URL 权限规则（核心修改：用 authorizeHttpRequests 替换 authorizeRequests）
                .authorizeHttpRequests(auth -> auth
                        // 放行不需要登录的路径（对应原 antMatchers 配置）
                        .requestMatchers(
                                adminContextPath + "/assets/**",    // 静态资源（CSS、JS、图片等）
                                adminContextPath + "/login",       // 登录页
                                adminContextPath + "/actuator/**", //  actuator 监控端点（按需调整）
                                adminContextPath + "/instances/**" // 监控实例相关接口（按需调整）
                        ).permitAll()
                        // 其他所有请求必须登录
                        .anyRequest().authenticated()
                )

                // 3. 配置表单登录（保持原有逻辑）
                .formLogin(form -> form
                        .loginPage(adminContextPath + "/login") // 自定义登录页路径
                        .successHandler(successHandler)         // 登录成功后的处理器
                )

                // 4. 配置登出（保持原有逻辑）
                .logout(logout -> logout
                        .logoutUrl(adminContextPath + "/logout") // 登出接口路径
                )

                // 5. 启用 HTTP Basic 认证（监控平台可能需要，保持原有逻辑）
                .httpBasic(AbstractHttpConfigurer::disable // 若不需要 HTTP Basic 可改为 disable，按需调整
                        // 若需要启用则删除 disable()，直接 .httpBasic()
                )

                // 6. 禁用 CSRF（监控平台若为内部使用，可禁用；外部暴露需谨慎）
                .csrf(AbstractHttpConfigurer::disable);

        // 构建并返回 SecurityFilterChain
        return http.build();
    }
}